package cn.imjzm.runcarserve.interceptor;

import cn.imjzm.runcarserve.pojo.Result;
import cn.imjzm.runcarserve.utils.JwtUtils;
import com.alibaba.fastjson2.JSONObject;
import io.jsonwebtoken.Claims;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;

import java.io.IOException;

/**
 * 拦截器
 */
@Slf4j
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
        // 1. 定义白名单路径（登录、注册、验证码等无需拦截的接口）
        String[] whiteList = {"/login", "/register", "/verify-code", "/send-code"};
        String requestURI = request.getRequestURI();

        // 2. 白名单路径直接放行
        for (String path : whiteList) {
            AntPathMatcher matcher = new AntPathMatcher();
            if (matcher.match(path, requestURI)) {
                System.out.println("白名单路径：" + requestURI + "，直接放行");
                return true;
            }
        }

        // 3. 获取请求头中的token
        String token = request.getHeader("token");

        // 4. token为空时返回401 + 错误信息
        if (token == null || token.trim().isEmpty()) {
            return handleError(response, "token不存在，请先登录");
        }

        // 5. 校验token并提取用户信息
        try {
            Claims claims = JwtUtils.parseJwt(token);
            // 从claims中提取用户标识（根据实际JWT载荷中的键名调整，如userId、username等）
            String email = claims.get("email", String.class);

            // 将用户信息注入到request，供后续控制器使用
            request.setAttribute("currentUserEmail", email);
            System.out.println("用户[" + email + "]令牌校验成功，放行...");
            return true;
        } catch (Exception e) {
            // 校验失败
            return handleError(response, "token无效或已过期，请重新登录");
        }
    }

    /**
     * 统一处理错误响应
     * @param response 响应对象
     * @param message 错误信息
     * @return false（拦截请求）
     */
    private boolean handleError(HttpServletResponse response, String message) throws IOException {
        response.setStatus(401); // 统一返回401状态码
        response.setContentType("application/json;charset=UTF-8");
        // 构建标准错误响应体（与前端约定的格式）
        JSONObject error = new JSONObject();
        error.put("code", 401);
        error.put("message", message);
        response.getWriter().write(error.toString());
        return false;
    }

}
